/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package runebound.modelo.monstruos.comportamientos;

import javax.swing.JLabel;
import runebound.manejadores.RBControladorJuego;
import runebound.manejadores.eventos.combate.RBEventoTestResultSinAccion;
import runebound.modelo.Habilidad;
import runebound.modelo.Miniatura;
import runebound.modelo.heores.Heroe;
import runebound.modelo.heores.experiencia.Atributo;
import runebound.modelo.monstruos.Monstruo;
import runebound.random.RBAzar;
import runebound.random.Tirada;
import runebound.ui.combate.RBAntesCombatePanel;
import runebound.ui.combate.RBAntesCombateTestPanel;

/**
 *
 * @author malopez
 */
public class AntesDeCombateTest implements AntesDeCombate{
    
    private Habilidad habilidad;
    private int valorTest;
    /**
     * A quien se le aplica la ación si ocurre un éxito;
     */
    private boolean objetivoExitoMonstruo;
    /**
     * Indica si al fallar el test el objetivo es un monstruo o un heroe
     */
    private boolean objetivoFalloMonstruo;
    /**
     * Nos indica si tenemos que ejecutar algún modificador en exito del test
     */
    private boolean hacerExito;
    /**
     * Nos indica si tenemos que ejecutar algún modificador en fallo del test
     */
    private boolean hacerFallo;
    
    private Atributo atributoExito;
    private Atributo atributoFallo;
    private int valorAccionExito;
    private int valorAccionFallo;

    /**
     * 
     * @param habilidad
     * @param valorTest
     * @param objetivoExitoMonstruo
     * @param objetivoFalloMonstruo
     * @param hacerExito
     * @param hacerFallo
     * @param atributoExito
     * @param atributoFallo
     * @param valorAccionExito
     * @param valorAccionFallo 
     */
    public AntesDeCombateTest(Habilidad habilidad, int valorTest, boolean objetivoExitoMonstruo, boolean objetivoFalloMonstruo, boolean hacerExito, boolean hacerFallo, Atributo atributoExito, Atributo atributoFallo, int valorAccionExito, int valorAccionFallo) {
        this.habilidad = habilidad;
        this.valorTest = valorTest;
        this.objetivoExitoMonstruo = objetivoExitoMonstruo;
        this.objetivoFalloMonstruo = objetivoFalloMonstruo;
        this.hacerExito = hacerExito;
        this.hacerFallo = hacerFallo;
        this.atributoExito = atributoExito;
        this.atributoFallo = atributoFallo;
        this.valorAccionExito = valorAccionExito;
        this.valorAccionFallo = valorAccionFallo;
    }

    
    
    
    
    protected void antesDeCombateTestExito(Miniatura objetivo){
        System.out.println("no hacer nada");
    }
    
    protected void antesDeCombateTestFallo(Miniatura objetivo){
        System.out.println("no hacer nada");
    }

    @Override
    public void antesDeCombate(Monstruo monstruo, Heroe heroe,Tirada tirada,RBAntesCombatePanel panel) {
        int valorBase = heroe.getValorHabilidad(this.habilidad);
        int valorAzar = tirada.getTotal();
        //informamos del resultado
        RBControladorJuego.getInstance().getControladorCombate().getFrame().informar(valorTest+"?=Tirada("+valorAzar+"+"+valorBase+"+["+this.habilidad+"])");
        boolean exito = valorTest<=(valorBase+valorAzar);
        if(exito){
            panel.setExitoTirada();
            if(hacerExito){
                
                Miniatura objetivo = heroe;
                if(this.objetivoExitoMonstruo){
                    objetivo = monstruo;
                }
                this.antesDeCombateTestExito(objetivo);
            }else{
                RBControladorJuego.getInstance().recibirEvento(new RBEventoTestResultSinAccion());
            }
        }else{
            panel.setFracasoTirada();
            if(hacerFallo){
                
                Miniatura objetivo = heroe;
                if(this.objetivoFalloMonstruo){
                    objetivo = monstruo;
                }
                this.antesDeCombateTestFallo(objetivo);
            }else{
                RBControladorJuego.getInstance().recibirEvento(new RBEventoTestResultSinAccion());
            }
        }
        
    }

    /**
     * @return the habilidad
     */
    public Habilidad getHabilidad() {
        return habilidad;
    }

    /**
     * @param habilidad the habilidad to set
     */
    public void setHabilidad(Habilidad habilidad) {
        this.habilidad = habilidad;
    }

    /**
     * @return the valorTest
     */
    public int getValorTest() {
        return valorTest;
    }

    /**
     * @param valorTest the valorTest to set
     */
    public void setValorTest(int valorTest) {
        this.valorTest = valorTest;
    }

    /**
     * @return the objetivoExitoMonstruo
     */
    public boolean isObjetivoExitoMonstruo() {
        return objetivoExitoMonstruo;
    }

    /**
     * @param objetivoExitoMonstruo the objetivoExitoMonstruo to set
     */
    public void setObjetivoExitoMonstruo(boolean objetivoExitoMonstruo) {
        this.objetivoExitoMonstruo = objetivoExitoMonstruo;
    }

    /**
     * @return the objetivoFalloMonstruo
     */
    public boolean isObjetivoFalloMonstruo() {
        return objetivoFalloMonstruo;
    }

    /**
     * @param objetivoFalloMonstruo the objetivoFalloMonstruo to set
     */
    public void setObjetivoFalloMonstruo(boolean objetivoFalloMonstruo) {
        this.objetivoFalloMonstruo = objetivoFalloMonstruo;
    }

    /**
     * @return the hacerExito
     */
    public boolean isHacerExito() {
        return hacerExito;
    }

    /**
     * @param hacerExito the hacerExito to set
     */
    public void setHacerExito(boolean hacerExito) {
        this.hacerExito = hacerExito;
    }

    /**
     * @return the hacerFallo
     */
    public boolean isHacerFallo() {
        return hacerFallo;
    }

    /**
     * @param hacerFallo the hacerFallo to set
     */
    public void setHacerFallo(boolean hacerFallo) {
        this.hacerFallo = hacerFallo;
    }

    /**
     * @return the atributoExito
     */
    public Atributo getAtributoExito() {
        return atributoExito;
    }

    /**
     * @param atributoExito the atributoExito to set
     */
    public void setAtributoExito(Atributo atributoExito) {
        this.atributoExito = atributoExito;
    }

    /**
     * @return the atributoFallo
     */
    public Atributo getAtributoFallo() {
        return atributoFallo;
    }

    /**
     * @param atributoFallo the atributoFallo to set
     */
    public void setAtributoFallo(Atributo atributoFallo) {
        this.atributoFallo = atributoFallo;
    }

    /**
     * @return the valorAccionExito
     */
    public int getValorAccionExito() {
        return valorAccionExito;
    }

    /**
     * @param valorAccionExito the valorAccionExito to set
     */
    public void setValorAccionExito(int valorAccionExito) {
        this.valorAccionExito = valorAccionExito;
    }

    /**
     * @return the valorAccionFallo
     */
    public int getValorAccionFallo() {
        return valorAccionFallo;
    }

    /**
     * @param valorAccionFallo the valorAccionFallo to set
     */
    public void setValorAccionFallo(int valorAccionFallo) {
        this.valorAccionFallo = valorAccionFallo;
    }

    @Override
    public String toString() {
        return "TEST_"+this.habilidad+"_"+this.valorTest;
    }

    public String getTextoPrueba() {
        return toString();
    }

    public String getTextoExito() {
        return ""+this.atributoExito+" "+valorAccionExito;
    }

    public String getTextoFracaso() {
        return ""+this.atributoFallo+" "+valorAccionFallo;
    }

    

    
    
}
